﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using SCEM.DTO;

namespace SCEM.DataLayer
{
    /// <summary>
    /// DAO de produtos.
    /// </summary>
    public class ProdutoDAO : EntityDAO<Produto>, IProdutoDAO
    {
        public ProdutoDAO()
        {
            CanEntityBeDisabled = true;
            EntityEnabledProperty = "Ativo";
            OrderByProperty = "Nome";
        }

        protected override IDTO<Produto> ConvertToDTO(Produto entity, ObjectContext context)
        {
            ProdutoDTO dto = new ProdutoDTO();
            dto.Id = entity.Id.ToString();
            dto.Codigo = entity.Codigo;
            dto.Nome = entity.Nome;
            dto.Descricao = entity.Descricao;
            dto.Quantidade = entity.Quantidade;
            dto.QuantidadeAlerta = entity.QuantidadeAlerta;
            dto.Fabricante = entity.Fabricante;
            dto.DataCadastro = entity.DataCadastro;
            dto.DataAtualizacao = entity.DataAtualizacao;
            dto.Ativo = entity.Ativo;

            // TipoProduto
            dto.IdTipoProduto = entity.TipoProduto.Id.ToString();
            dto.NomeTipoProduto = entity.TipoProduto.Nome;

            return dto;
        }

        #region Métodos adicionais definidos em IProdutoDAO
        public List<ProdutoDTO> ListarProdutosEstoque()
        {
            List<ProdutoDTO> listaDTO = new List<ProdutoDTO>();

            using (SCEMContainer context = new SCEMContainer())
            {
                IQueryable<Produto> query = context.Produtos.Where(p => p.Quantidade > 0);
                List<Produto> listaProdutosEstoque = query.ToList();
                foreach (Produto produto in listaProdutosEstoque)
                    listaDTO.Add((ProdutoDTO)ConvertToDTO(produto, context));

                return listaDTO;
            }
        }

        public List<ProdutoDTO> ListarProdutosAlerta()
        {
            List<ProdutoDTO> listaDTO = new List<ProdutoDTO>();

            using (SCEMContainer context = new SCEMContainer())
            {
                IQueryable<Produto> query = context.Produtos.Where(p => p.Quantidade < p.QuantidadeAlerta);
                List<Produto> listaProdutosAlerta = query.ToList();
                foreach (Produto produto in listaProdutosAlerta)
                    listaDTO.Add((ProdutoDTO)ConvertToDTO(produto, context));

                return listaDTO;
            }
        }
        #endregion

    }
}
